package com.bestcem.xm.label.dao;

import com.bestcem.xm.label.entity.pojo.LabelGroupDO;
import com.bestcem.xm.label.entity.pojo.LabelValueDO;

import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * @author ming.xue <ming.xue@idiaoyan.com>
 * @desc 标签数据访问服务
 * @date 2021-05-19
 */
public interface LabelValueDao {

    /**
     * 获取标签值列表
     *
     * @param orgId 组织id
     * @param auto  是否自动打标签: 0-false 1-true
     * @return List<LabelValueDO>
     */
    List<LabelValueDO> listByOrgIdAndAuto(String orgId, Boolean auto);

    /**
     * 获取标签值列表
     *
     * @param orgId
     * @param labelId
     * @param auto
     * @return
     */
    List<LabelValueDO> listByOrgIdAndLabelIdAndAuto(String orgId, String labelId, Boolean auto);

    /**
     * 根据标签id,获取所有的标签值
     *
     * @param labelId 标签id
     * @return List<LabelValueDO>
     */
    List<LabelValueDO> listByLabelId(String labelId);

    /**
     * 批量新增
     *
     * @param labelValues 标签值
     * @return List<LabelValueDO>
     */
    void saveBatch(List<LabelValueDO> labelValues);

    /**
     * 根据 标签id 和 标签值名称获取标签信息
     *
     * @param labelId 标签id
     * @param value   标签值的value
     * @return
     */
    List<LabelValueDO> listByLabelIdAndValue(String labelId, String value);

    /**
     * 根据标签id,获取当前标签标签值的数量
     *
     * @param labelId 标签id
     */
    Integer countByLabelId(String labelId);

    /**
     * 根据标签值id,批量删除标签值
     *
     * @param labelValueIds 标签值id
     */
    Boolean deleteByIds(List<String> labelValueIds);

    /**
     * 删除标签组下所有的标签值
     *
     * @return labelGroupId 标签组ID
     */
    Boolean deleteByLabelGroupId(@NotNull String labelGroupId);

    /**
     * 根据id 更新 标签值的serial
     *
     * @param seq
     * @param id
     * @return
     */
    Boolean updateSerialByParam(Integer seq, String id, Date updateTime);

    /**
     * 更新标签组下所有标签值中存在的标签组信息，
     *
     * @param labelGroupDO 标签组信息，通过labelGroupId匹配
     * @return
     */
    Boolean updateLabelGroupInfo(LabelGroupDO labelGroupDO);


    /**
     * 根据id 获取标签值信息
     *
     * @param ids 标签值id
     * @return List<LabelValueDO>
     */
    List<LabelValueDO> listByIds(List<String> ids);

    /**
     * 根据组织id 标签值id列表 联系人类型 获取相关标签值信息
     *
     * @param orgId      组织id
     * @param memberType 联系人类型
     * @param ids        标签值ids
     * @return List<LabelValueDO>
     */
    List<LabelValueDO> listByOrgIdAndAttributeAndIds(String orgId, Integer memberType, List<String> ids);

    /**
     * 根据组织id 联系人类型 获取相关标签值信息
     *
     * @param orgId      企业标识
     * @param memberType 联系人类型 0-个人联系人 1-机构联系人 2-内部联系人
     * @return List<LabelValueDO>
     */
    List<LabelValueDO> listByOrgIdAndMemberType(String orgId, Integer memberType);

    /**
     * 根据组织id 联系人类型 获取相关标签值信息 根据 Serial 倒叙
     *
     * @param orgId      企业标识
     * @param memberType 联系人类型 0-个人联系人 1-机构联系人 2-内部联系人
     * @return
     */
    List<LabelValueDO> listByOrgIdAndMemberTypeSortBySerial(String orgId, Integer memberType);


    /**
     * 根据入参更新标签值
     *
     * @param labelValue 标签值
     * @return LabelValueDO
     */
    void insertOrReplace(LabelValueDO labelValue);

    /**
     * 更新 标签值的冗余信息
     *
     * @param labelValueDO
     * @return
     */
    Boolean updateLabelInfo(LabelValueDO labelValueDO);

    /**
     * 批量更新标签值信息
     *
     * @param updateValues
     * @return
     */
    Boolean batchUpdateLabelValue(List<LabelValueDO> updateValues);

    /**
     * 批量处理行业sample数据
     *
     * @param newLabelValueList
     */
    void batchSaveSampleData(List<LabelValueDO> newLabelValueList);

    /**
     * 根据组织id 和 标签id 统计数据
     *
     * @param orgId
     * @param labelId
     * @return
     */
    Integer countByOrgIdAndLabelId(String orgId, String labelId);

    /**
     * 删除该组织 标签下的标签值
     *
     * @param orgId
     * @param labelId
     */
    void deleteByOrgIdAndLabelId(String orgId, String labelId);

    /**
     * 统计标签值
     *
     * @param ids
     * @return
     */
    long countByIds(Set<String> ids);

    /**
     * 批量查询标签下所有标签值
     *
     * @param orgId 企业id
     * @param labelIds 标签id集合
     * @return LabelValue
     */
    List<LabelValueDO> findByLabelIds(String orgId, List<String> labelIds);

    /**
     * 批量根据 标签id 删除标签值
     *
     * @param orgId
     * @param memberType
     * @param deleteValuesLabelIds
     */
    void batchDeleteByLabelIds(String orgId, int memberType, List<String> deleteValuesLabelIds);

    /**
     * 批量创建
     *
     * @param allInsertValues
     */
    void batchSave(List<LabelValueDO> allInsertValues);

    /**
     * 分页查询标签值
     *
     * @param offset    offset
     * @param batchSize batchSize
     * @return 标签值列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 11:45 2022/4/13
     */
    List<LabelValueDO> listBySamplePaging(long offset, int batchSize);

    void updateCondition(LabelValueDO labelValue);
}
